--File  : LuaModuleExtend.lua
--Author : zhoujibo
--Date   : 2015/5/28
--desc: 此文件专门用于扩展或改写框架已有的内置模块用

--清空一个列表
function table.empty(t)
    for k in pairs (t) do
        t [k] = nil
    end    
end


--判断表是否为空
function table.isEmpty(t)
    return next(t)==nil
end


-- 获取字典表的长度
function table.dicLen(dic)
    local n = 0
    for _,_ in pairs(dic)do 
        n = n + 1
    end
    return n
end

-- 获取字典表的键序列
function table.dicKeys(dic)
    local arrKeys = {}
    for key in pairs(dic)do 
        table.insert(arrKeys,key)
    end
    return arrKeys
end

-- 获取字典表的所有值
function table.dicValues(dic)
    local arrValues = {}
    for _,v in pairs(dic)do 
        table.insert(arrValues,v)
    end
    return arrValues
end

function table.reduce(list,fn)
    local acc
    for k,v in ipairs(list)do
        if 1 == k then
            --todo 对与复合对象来说，此处应该用深拷贝 zjb 2015年5月28日
            acc = v
        else
            acc = fn(acc,v)
        end 
    end 
    return acc 
end

if table.getn then
    table.getn = function(t)
        assert(false,'table.getn()该方法已过期，用#替换')
        return #t
    end
end


-- 获取数组中指定元素的位置，位置为遍历所遇到的第一个元素的位置，如果没有元素，返回0
--todo 方法摘自cocos/cocos2d/functions.lua 有机会可以合并
function table.indexOf(array, value, begin)
    for i = begin or 1, #array do
        if array[i] == value then return i end
    end
    return false
end

function table.slice(t,startIndex,endIndex)
    local length = #t
    startIndex = startIndex or 1
    endIndex = endIndex or length
    if startIndex<=0 then
        startIndex = math.max(1,length+startIndex)
    end
    if endIndex<=0 then
        endIndex = math.max(1,length+endIndex)
    end
    startIndex = math.min(length,startIndex)
    endIndex = math.min(length,endIndex)
    local step = startIndex<=endIndex and 1 or -1
    local result = {}
    local j = 1
    for i = startIndex,endIndex,step do
        result[j] = t[i]
        j = j+1
    end
    return result
end






-- 分割字符串，返回分割后的结果数组，如果sep不填写，则把字符串切分成单个字符数组
function string.split(s,sep)
    if s == nil then return nil end
    assert(type(s)=='string',s..' is not a stirng type in split function!')
    if sep==nil then sep = '' end
    local l = string.len(s)
    local i = 1
    local result = {}
    if sep == '' then
        for i = 1,l do
            table.insert(result,string.sub(s,i,i))
        end
    else
        local sepLen = string.len(sep)
        while(i<=l)do
            local n = string.find(s,sep,i,true)
            if n then
                if i == n then 
                    table.insert(result,'')
                else
                    table.insert(result,string.sub(s,i,n-1))
                end
                i = n+sepLen
            else
                table.insert(result,string.sub(s,i))
                break
            end
        end
    end
    
    return result
end


function string.trim(s)
    return string.match(s,"^%s*(.-)%s*$")
end

function string.formatI(str,...)
    local defaultI = 1
    local args = {select(1,...)}
    if type(args[1])=='table' then
        args = args[1]
    end
    return(string.gsub(str,"({([^}]*)})",
    function(whole,i)
        i = string.trim(i)
        if i=='' then
            i = defaultI
            defaultI = defaultI+1
        elseif not args[i] then
            i = tonumber(i)
        end
        return tostring(args[i] or whole)
    end))
end


--endregion
